// Copyright (c) 2005  INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of cgal-python; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; version 2.1 of the License.
// See the file LICENSE.LGPL distributed with cgal-python.
//
// Licensees holding a valid commercial license may use this file in
// accordance with the commercial license agreement provided with the software.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// $Id: Py_Min_annulus_d.cpp 167 2007-11-02 15:36:54Z spion $
// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal-python/trunk/cgal-python/bindings/Geometric_Optimisation/Py_Min_annulus_d.cpp $
//
// Author(s)     : Naceur Meskini
//=========================================================================

// include ====================================================================
#include <CGAL/basic.h>
#include <include/Kernels.h>
#include <CGAL/Min_annulus_d.h>
#include <CGAL/Optimisation_d_traits_2.h>
#include <CGAL/Optimisation_d_traits_3.h>
#include <include/iterator.h>

#include "Py_Min_annulus_d_doc.h"

#include <boost/python.hpp>
#include <boost/cstdint.hpp>

// Using =======================================================================
using namespace boost::python;

// Declarations ================================================================
namespace  {

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(traits_2_is_valid_overloads_0_2, is_valid, 0, 2)
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(traits_3_is_valid_overloads_0_2, is_valid, 0, 2)

}// namespace 

template<class kernel>
void Py_Min_annulus_d()
{
	typedef typename kernel::Point_2 Point_2;
	typedef typename kernel::Point_3 Point_3;

	typedef CGAL::Optimisation_d_traits_2<kernel> traits_2;
	typedef CGAL::Optimisation_d_traits_3<kernel> traits_3;
	typedef CGAL::Min_annulus_d<traits_2> Min_annulus_2;
	typedef CGAL::Min_annulus_d<traits_3> Min_annulus_3;

    class_< Min_annulus_2 >("Min_annulus_2",Min_annulus_2_doc, init< const Min_annulus_2& >())
        .def(init< optional< const traits_2& > >(init_2_doc))
        .def("insert", (void (Min_annulus_2::*)( const Point_2&))&Min_annulus_2::insert,insert_doc)
        .def("ambient_dimension", &Min_annulus_2::ambient_dimension,ambient_dimension_doc)
        .def("number_of_points", &Min_annulus_2::number_of_points,number_of_points_doc)
        .def("points_begin", &Min_annulus_2::points_begin)
        .def("points_end", &Min_annulus_2::points_end)
        .def("number_of_support_points", &Min_annulus_2::number_of_support_points,number_of_support_points_doc)
        .def("number_of_inner_support_points", &Min_annulus_2::number_of_inner_support_points,number_of_inner_support_points_doc)
        .def("number_of_outer_support_points", &Min_annulus_2::number_of_outer_support_points,number_of_outer_support_points_doc)
        .def("inner_support_points_begin", &Min_annulus_2::inner_support_points_begin)
        .def("inner_support_points_end", &Min_annulus_2::inner_support_points_end)
        .def("outer_support_points_begin", &Min_annulus_2::outer_support_points_begin)
        .def("outer_support_points_end", &Min_annulus_2::outer_support_points_end)
        .def("center_coordinates_begin", &Min_annulus_2::center_coordinates_begin)
        .def("center_coordinates_end", &Min_annulus_2::center_coordinates_end)
        .def("squared_inner_radius_numerator", &Min_annulus_2::squared_inner_radius_numerator,squared_inner_radius_numerator_doc)
        .def("squared_outer_radius_numerator", &Min_annulus_2::squared_outer_radius_numerator,squared_outer_radius_numerator_doc)
        .def("squared_radii_denominator", &Min_annulus_2::squared_radii_denominator,squared_radii_denominator_doc)
        .def("center", &Min_annulus_2::center,center_doc)
        .def("squared_inner_radius", &Min_annulus_2::squared_inner_radius,squared_inner_radius_doc)
        .def("squared_outer_radius", &Min_annulus_2::squared_outer_radius,squared_outer_radius_doc)
        .def("bounded_side", &Min_annulus_2::bounded_side,bounded_side_doc)
        .def("has_on_bounded_side", &Min_annulus_2::has_on_bounded_side,has_on_bounded_side_doc)
        .def("has_on_boundary", &Min_annulus_2::has_on_boundary,has_on_boundary_doc)
        .def("has_on_unbounded_side", &Min_annulus_2::has_on_unbounded_side,has_on_unbounded_side_doc)
        .def("is_empty", &Min_annulus_2::is_empty,is_empty_doc)
        .def("is_degenerate", &Min_annulus_2::is_degenerate,is_degenerate_doc)
        .def("clear", &Min_annulus_2::clear,clear_doc)
        .def("is_valid", &Min_annulus_2::is_valid, traits_2_is_valid_overloads_0_2(is_valid_doc))
        //.def("traits", &Min_annulus_2::traits, return_value_policy< copy_const_reference >())
    ;

    class_< Min_annulus_3 >("Min_annulus_3", Min_annulus_3_doc,init< const Min_annulus_3& >())
        .def(init< optional< const traits_3& > >(init_3_doc))
        .def("insert", (void (Min_annulus_3::*)( const Point_3&))&Min_annulus_3::insert,insert_doc)
        .def("ambient_dimension", &Min_annulus_3::ambient_dimension,ambient_dimension_doc)
        .def("number_of_points", &Min_annulus_3::number_of_points,number_of_points_doc)
        .def("points_begin", &Min_annulus_3::points_begin)
        .def("points_end", &Min_annulus_3::points_end)
        .def("number_of_support_points", &Min_annulus_3::number_of_support_points,number_of_support_points_doc)
        .def("number_of_inner_support_points", &Min_annulus_3::number_of_inner_support_points,number_of_inner_support_points_doc)
        .def("number_of_outer_support_points", &Min_annulus_3::number_of_outer_support_points,number_of_outer_support_points_doc)
        .def("inner_support_points_begin", &Min_annulus_3::inner_support_points_begin)
        .def("inner_support_points_end", &Min_annulus_3::inner_support_points_end)
        .def("outer_support_points_begin", &Min_annulus_3::outer_support_points_begin)
        .def("outer_support_points_end", &Min_annulus_3::outer_support_points_end)
        .def("center_coordinates_begin", &Min_annulus_3::center_coordinates_begin)
        .def("center_coordinates_end", &Min_annulus_3::center_coordinates_end)
        .def("squared_inner_radius_numerator", &Min_annulus_3::squared_inner_radius_numerator,squared_inner_radius_numerator_doc)
        .def("squared_outer_radius_numerator", &Min_annulus_3::squared_outer_radius_numerator,squared_outer_radius_numerator_doc)
        .def("squared_radii_denominator", &Min_annulus_3::squared_radii_denominator,squared_radii_denominator_doc)
        .def("center", &Min_annulus_3::center,center_doc)
        .def("squared_inner_radius", &Min_annulus_3::squared_inner_radius,squared_inner_radius_doc)
        .def("squared_outer_radius", &Min_annulus_3::squared_outer_radius,squared_outer_radius_doc)
        .def("bounded_side", &Min_annulus_3::bounded_side,bounded_side_doc)
        .def("has_on_bounded_side", &Min_annulus_3::has_on_bounded_side,has_on_bounded_side_doc)
        .def("has_on_boundary", &Min_annulus_3::has_on_boundary,has_on_boundary_doc)
        .def("has_on_unbounded_side", &Min_annulus_3::has_on_unbounded_side,has_on_unbounded_side_doc)
        .def("is_empty", &Min_annulus_3::is_empty,is_empty_doc)
        .def("is_degenerate", &Min_annulus_3::is_degenerate,is_degenerate_doc)
        .def("clear", &Min_annulus_3::clear,clear_doc)
        .def("is_valid", &Min_annulus_3::is_valid, traits_3_is_valid_overloads_0_2(is_valid_doc))
//         .def("traits", &Min_annulus_3::traits, return_value_policy< copy_const_reference >())
    ;
}

void export_Min_annulus_d()
{
	Py_Min_annulus_d<K>();
}
